#ifndef _DATA_H_
#define _DATA_H_

extern int score;
extern int grade;

//数据模块初始化【程序启动时提前准备好分数、等级、蛇、食物】
void dataInitData();

//定义食物类型
typedef struct Food
{
    int x; //水平坐标
    int y; //竖直坐标
}Food;
//注意：使用小坐标[0,0] - [23,23]

//定义方向类型
typedef enum Dir
{
    UP = 0b10000001,
    DOWN = 0b01000001,
    LEFT = 0b00100010,
    RIGHT = 0b00010010
} DIR;

//定义结点
typedef struct Node
{
    int x;
    int y;
    struct Node *next;
}SnakeNode;

//定义蛇【链表】
typedef struct Snake
{
    SnakeNode *head;
    DIR dir; //蛇头朝向
    int len; //结点个数
}Snake;

//声明唯一的食物
extern Food food;

//声明唯一的蛇
extern Snake snake;

//初始化一条蛇
void dataInitSnake();

//校验食物是否和蛇重合，返回1表示覆盖，返回0 表未重合
int isCoverSnake(int x,int y);

//食物的初始化与更新
void dataUpdateFood();

//按照方向移动蛇
void dataSnakeMove(DIR dir);

//之前的蛇尾坐标
extern int preX;
extern int preY;


extern Food food;
extern Snake snake;



//定义移动蛇后结果类型
typedef enum ReType
{
    DirError=0b00000001, //方向错误
    Hit =0b00000010, //咬到自己 或 撞墙
    Move =0b00000100, //成功移动
    Score =0b00001000, //吃到食物，分值增加
    Grade =0b00010000 //吃到食物，级别增加
}ReType;

//如果能咬到自己，则返回 1，否则返回0
int isBiteSelf(int x,int y);

//蛇移动，并返回移动后效果
ReType dataMoveSnake2(DIR dir);

#endif // _DATA_H_
